package controle;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import persistencia.Abrir;
import persistencia.Carregar;
import persistencia.Salvar;

import modelo.AutomatoFinito;
import modelo.AutomatoParaGramatica;
import modelo.ERparaAF;
import modelo.Estado;
import modelo.ExpressaoRegular;
import modelo.Gramatica;
import modelo.GramaticaParaAutomato;


public class Main {
	

	public static void main(String[] args) {
		ExpressaoRegular er = new ExpressaoRegular();
		Gramatica g = new Gramatica("abcd", "SAB");
		er.adicionarNovaExpressao("ab", "(a?b+)*");
		g.addProducao("S->aA | bB | b | aS");
		g.addProducao("A->bB | aA | a | b");
		g.addProducao("B->cS | a");
		System.out.println(er.toString());
		System.out.println(g.toString());
		er.editarExpressao("(a+b*)");
		g.editarProducao("B->bB | cS | d", 2);
		System.out.println(er.toString());
		System.out.println(g.toString());

		// AF
		AutomatoFinito af = new AutomatoFinito();

		Estado q0 = new Estado("q0");
		Estado q1 = new Estado("q1");

		q0.addTransicao('a', q1);
		q0.addTransicao('b', q0);
		q0.addTransicao('c', q0);
		q1.addTransicao('a', q1);
		q1.addTransicao('b', q0);
		q1.addTransicao('c', q1);
		q0.setInicial(true);
		q1.setFinal(true);
		af.addEstado(q0);
		af.addEstado(q1);

		// af.printAF();

		GramaticaParaAutomato ga = new GramaticaParaAutomato();
		AutomatoFinito af2 = ga.conversao(g);
		af2.printAF();

		AutomatoParaGramatica ag = new AutomatoParaGramatica();
		Gramatica g1 = ag.conversao(af2); 
		System.out.println(g1.toString());
		
		/*String ere = "((ab|ba)*|(a|b)*)* |(ab|ba)";
	
		int i = 0;
		ere = ere.replaceAll("a", "R0");
		ere = ere.replaceAll("b", "R1");
		ere = ere.replaceAll("R0\\|R1", "R4");
		ere = ere.replaceAll("R0R1", "R2");
		ere = ere.replaceAll("R1R0", "R3");

		/*String []s1 = ere.split("[()]");

		System.out.println(ere);

		for(String s : s1){
			System.out.println(s);
			ere = ere.replaceAll("a.b", "R" + i);
		}
	    System.out.println(ere);
		
		AutomatoFinito a1 = new AutomatoFinito();
		Estado q00 = new Estado("q00");
		Estado q01 = new Estado("q01");
		q00.addTransicao('a', q01);
		q00.setInicial(true);
		q01.setFinal(true);
		a1.addEstado(q00);
		a1.addEstado(q01);
		a1.printAF();
		
		AutomatoFinito a2 = new AutomatoFinito();
		Estado q000 = new Estado("q000");
		Estado q001 = new Estado("q001");
		q000.addTransicao('b', q001);
		q000.setInicial(true);
		q001.setFinal(true);
		a2.addEstado(q000);
		a2.addEstado(q001);
		a2.printAF();
		
		ERparaAF erpaf = new ERparaAF();
		AutomatoFinito a3 = erpaf.concatenar(a1, a2);
		System.out.println("concatenado");
		a3.printAF();
		System.out.println("fechamento");
	    a3 = erpaf.fechamento(a1);
		a3.printAF();
		System.out.println("ou");
		a3 = erpaf.ou(a1, a2);
		a3.printAF();*/
		
		Salvar salvar = new Salvar();
		ArrayList<AutomatoFinito> afs = new ArrayList<AutomatoFinito>();
		ArrayList<ExpressaoRegular> ers = new ArrayList<ExpressaoRegular>();
		ArrayList<Gramatica> grs = new ArrayList<Gramatica>();
		afs.add(af);
		ers.add(er);
		grs.add(g);
		salvar.save(afs, ers, grs);
		afs = new ArrayList<AutomatoFinito>();
		ers = new ArrayList<ExpressaoRegular>();
		grs = new ArrayList<Gramatica>();
		
		Abrir abrir = new Abrir();
		abrir.load();
		
		Carregar carr = new Carregar();
		carr.abrir(afs, ers, grs);

		System.out.println("Aqui");
		afs.get(0).printAF();
		System.out.println(grs.get(0).toString());
		System.out.println(er.toString());
		
		
	}
		
			

	

}
